home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 03 / wintro6 / db.c next >
C/C++ Source or Header  |  1991-05-01  |  7KB  |  248 lines

  1. /*=================================================================*/
  2. /*                                                                 */
  3. /* File    : DB.C                                                  */
  4. /*                                                                 */
  5. /* Purpose : Simple database routines for the stock charting app   */
  6. /*                                                                 */
  7. /* History :                                                       */
  8. /*                                                                 */
  9. /* (C) Copyright 1990,1991 Marc Adler/Magma Systems                */
  10. /*=================================================================*/
  11.  
  12. #include <string.h>
  13. #include <fcntl.h>
  14. #include <io.h>
  15. #include <sys\types.h>
  16. #include <sys\stat.h>
  17.  
  18. #include "windows.h"
  19. #include "stock.h"
  20.  
  21.  
  22. HANDLE PASCAL StockInfoAlloc(void)
  23. {
  24.   HANDLE hStockInfo;
  25.   LPSTOCKINFO lpStockInfo;
  26.   LPGRAPHINFO lpGraphInfo;
  27.  
  28.   if ((hStockInfo = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 
  29.                                 (DWORD) sizeof(STOCKINFO))) == NULL)
  30.     return NULL;
  31.   if ((lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo)) == NULL)
  32.   {
  33.     ErrorMessage(ERR_CANTALLOCINFO);
  34.     GlobalFree(hStockInfo);
  35.     return NULL;
  36.   }
  37.  
  38.   lstrcpy(lpStockInfo->szFileName, (LPSTR) "(Untitled)");
  39.  
  40.   /*
  41.    * Set the initial attributes of the graph 
  42.    */
  43.   lpGraphInfo = &lpStockInfo->StockFile.graphinfo;
  44.   lpGraphInfo->dwMinPrice     = 1;
  45.   lpGraphInfo->dwMaxPrice     = 100;
  46.   lpGraphInfo->dwScaleFactor  = 1;
  47.   lpGraphInfo->dwTickInterval = 1;
  48.   lpGraphInfo->iDenominator   = 1;
  49.  
  50.   lpStockInfo->StockFile.dwMagic = MAGIC_COOKIE;
  51.   lpStockInfo->dwFlags |= (STATE_HAS_VGRID | STATE_HAS_HGRID);
  52.   lpStockInfo->graphAttrs.iMappingMode = MM_ISOTROPIC;
  53.   lpStockInfo->graphAttrs.idxPen = 0;
  54.   lpStockInfo->graphAttrs.clrPen = RGB(0x00, 0x00, 0x00);
  55.   lpStockInfo->graphAttrs.idxBackground = 7;
  56.   lpStockInfo->graphAttrs.clrBackground = RGB(0xFF, 0xFF, 0xFF);
  57.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ISOTROPIC, 
  58.                                    MF_BYCOMMAND | MF_CHECKED);
  59.   CheckMenuItem(GetMenu(hWndMain), ID_GRAPH_ANISOTROPIC, 
  60.                                    MF_BYCOMMAND | MF_UNCHECKED);
  61.  
  62.   GlobalUnlock(hStockInfo);
  63.   return hStockInfo;
  64. }
  65.  
  66.  
  67.  
  68. /*******************************************************************/
  69. /*                                                                 */
  70. /* Function : StockFIleRead()                                      */
  71. /*                                                                 */
  72. /* Purpose  : Reads a stock file in from the disk and allocates a  */
  73. /*            stock information structure for it.                  */
  74. /*                                                                 */
  75. /* Returns  : TRUE if the stock file was read, FALSE if not.       */
  76. /*                                                                 */
  77. /*******************************************************************/
  78. int PASCAL
  79. StockFileRead(LPSTR szFileName)
  80. {
  81.   char sz[128];
  82.   int fd;
  83.   int rc = FALSE;
  84.   HANDLE hStockInfo;
  85.   LPSTOCKINFO lpStockInfo;
  86.   LPTICK lpTick;
  87.   HWND hWnd;
  88.  
  89.   /*
  90.    * Make sure it has the .STO extension if the user didn't
  91.    * specify one 
  92.    */
  93.   lstrcpy((LPSTR) sz, szFileName);
  94.   if (!strchr(sz, '.'))
  95.     strcat(sz, ".sto");
  96.  
  97.   /*
  98.    * Open the file for reading 
  99.    */
  100.   if ((fd = _lopen(sz, O_RDONLY | O_BINARY)) < 0)
  101.   {
  102.     return ErrorMessage(ERR_CANTOPEN);
  103.   }
  104.  
  105.   /*
  106.     Allocate a stock information structure
  107.   */
  108.   if ((hStockInfo = StockInfoAlloc()) == NULL)
  109.     return FALSE;
  110.   if ((lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo)) == NULL)
  111.   {
  112.     ErrorMessage(ERR_CANTALLOCINFO);
  113.     GlobalFree(hStockInfo);
  114.     return NULL;
  115.   }
  116.  
  117.   /*
  118.    * Save the absolute path name of the file 
  119.    */
  120.   lstrcpy(lpStockInfo->szFileName, (LPSTR) sz);
  121.  
  122.   /*
  123.    * Read the header 
  124.    */
  125.   if (_lread(fd, (LPSTR) & lpStockInfo->StockFile, sizeof(STOCKFILE))
  126.                   != sizeof(STOCKFILE))
  127.   {
  128.     ErrorMessage(ERR_BADHEADER);
  129.     GlobalUnlock(hStockInfo);
  130.     GlobalFree(hStockInfo);
  131.     goto bye;
  132.   }
  133.  
  134.   /*
  135.    * Check the magic number to see if it's really a stock db
  136.    * file 
  137.    */
  138.   if (lpStockInfo->StockFile.dwMagic != MAGIC_COOKIE)
  139.   {
  140.     ErrorMessage(ERR_BADSIG);
  141.     GlobalUnlock(hStockInfo);
  142.     GlobalFree(hStockInfo);
  143.     goto bye;
  144.   }
  145.  
  146.   /*
  147.    * Allocate global memory to hold the ticks 
  148.    */
  149.   if ((lpStockInfo->hTicks = GlobalAlloc(GMEM_MOVEABLE,
  150.          (DWORD)sizeof(TICK)*lpStockInfo->StockFile.nTicks)) == NULL)
  151.   {
  152.     ErrorMessage(ERR_CANTALLOCTICKER);
  153.     goto bye;
  154.   }
  155.   lpStockInfo->nTicksAllocated = lpStockInfo->StockFile.nTicks;
  156.   if ((lpTick = (LPTICK) GlobalLock(lpStockInfo->hTicks)) == NULL)
  157.   {
  158.     ErrorMessage(ERR_CANTALLOCTICKER);
  159.     GlobalFree(lpStockInfo->hTicks);
  160.     goto bye;
  161.   }
  162.  
  163.   /*
  164.    * Read the ticks into the global memory buffer 
  165.    */
  166.   if (_lread(fd, (LPSTR) lpTick, 
  167.                  sizeof(TICK) * lpStockInfo->StockFile.nTicks) !=
  168.                  sizeof(TICK) * lpStockInfo->StockFile.nTicks)
  169.   {
  170.     ErrorMessage(ERR_CANTREADTICKER);
  171.     GlobalUnlock(lpStockInfo->hTicks);
  172.     GlobalFree(lpStockInfo->hTicks);
  173.     goto bye;
  174.   }
  175.  
  176.   /*
  177.    * Create a window for this guy 
  178.    */
  179.   hWnd = lpStockInfo->hWnd = GraphCreateWindow((LPSTR) sz);
  180.   SetWindowWord(hWnd, 0, hStockInfo);
  181.  
  182.   /*
  183.    * Link this entry onto the stock info list 
  184.    */
  185.   hCurrStockInfo = hStockInfo;
  186.  
  187.   GlobalUnlock(lpStockInfo->hTicks);
  188.   rc = TRUE;
  189.  
  190.   /*
  191.    * Done reading .... close the file 
  192.    */
  193. bye:
  194.   close(fd);
  195.  
  196.   GlobalUnlock(hStockInfo);
  197.   if (hWnd)
  198.   {
  199.     InvalidateRect(hWnd, (LPRECT) NULL, FALSE);
  200.     UpdateWindow(hWnd);
  201.   }
  202.   return rc;
  203. }
  204.  
  205.  
  206. int PASCAL StockFileSave(HANDLE hStockInfo)
  207. {
  208.   int         fd;
  209.   LPTICK      lpTicks;
  210.   LPSTOCKINFO lpStockInfo;
  211.  
  212.   lpStockInfo = (LPSTOCKINFO) GlobalLock(hStockInfo);
  213.   lpTicks = (LPTICK) GlobalLock(lpStockInfo->hTicks);
  214.  
  215. MessageBox(hWndMain, lpStockInfo->szFileName, "StockName", MB_OK);
  216.  
  217.   if ((fd = _lopen(lpStockInfo->szFileName, OF_WRITE)) < 0)
  218.   {
  219.     if ((fd = _lcreat(lpStockInfo->szFileName, 0)) < 0)
  220.       return ErrorMessage(ERR_CANTOPEN);
  221.   }
  222.  
  223.   _lwrite(fd, (LPSTR) & lpStockInfo->StockFile, sizeof(STOCKFILE));
  224.   _lwrite(fd, (LPSTR) lpTicks, 
  225.               sizeof(TICK) * lpStockInfo->StockFile.nTicks);
  226.   close(fd);
  227.  
  228.   lpStockInfo->dwFlags &= ~STATE_DIRTY;
  229.   GlobalUnlock(lpStockInfo->hTicks);
  230.   GlobalUnlock(hStockInfo);
  231.  
  232.   MessageBox(hWndMain, "The file has been saved", "Stock", MB_OK);
  233.   return TRUE;
  234. }
  235.  
  236.  
  237. int PASCAL ErrorMessage(WORD idMsg)
  238. {
  239.   char szMsg[80];
  240.  
  241.   if (LoadString(hThisInstance, idMsg, (LPSTR) szMsg, sizeof(szMsg)))
  242.   {
  243.     MessageBox(hWndMain, szMsg, NULL, MB_OK | MB_ICONEXCLAMATION);
  244.   }
  245.   return FALSE;
  246. }
  247.  
  248.